home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xpaint-2.1.1 / rw / libpnmrw.h < prev    next >
C/C++ Source or Header  |  1995-05-03  |  6KB  |  184 lines

  1. /* pnmrw.h - header file for PBM/PGM/PPM read/write library
  2. **
  3. ** Copyright (C) 1988, 1989, 1991 by Jef Poskanzer.
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided "as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #ifndef _PNMRW_H_
  14. #define _PNMRW_H_
  15.  
  16. /* CONFIGURE: On some systems, malloc.h doesn't declare these, so we have
  17. ** to do it.  On other systems, for example HP/UX, it declares them
  18. ** incompatibly.  And some systems, for example Dynix, don't have a
  19. ** malloc.h at all.  A sad situation.  If you have compilation problems
  20. ** that point here, feel free to tweak or remove these declarations.
  21. #include <malloc.h>
  22. */
  23.  
  24. /* End of configurable definitions. */
  25.  
  26.  
  27. /* Definitions to make PBMPLUS work with either ANSI C or C Classic. */
  28.  
  29. #if __STDC__
  30. #define ARGS(alist) alist
  31. #else /*__STDC__*/
  32. #define ARGS(alist) ()
  33. #define const
  34. #endif /*__STDC__*/
  35.  
  36.  
  37. /* Types. */
  38.  
  39. typedef unsigned char bit;
  40. #define PBM_WHITE 0
  41. #define PBM_BLACK 1
  42. #define PBM_FORMAT_TYPE(f) ((f) == PBM_FORMAT || (f) == RPBM_FORMAT ? PBM_TYPE : -1)
  43.  
  44. typedef unsigned char gray;
  45. #define PGM_MAXMAXVAL 255
  46. #define PGM_FORMAT_TYPE(f) ((f) == PGM_FORMAT || (f) == RPGM_FORMAT ? PGM_TYPE : PBM_FORMAT_TYPE(f))
  47.  
  48. typedef gray pixval;
  49. #define PPM_MAXMAXVAL PGM_MAXMAXVAL
  50. typedef struct
  51.     {
  52.     pixval r, g, b;
  53.     } pixel;
  54. #define PPM_GETR(p) ((p).r)
  55. #define PPM_GETG(p) ((p).g)
  56. #define PPM_GETB(p) ((p).b)
  57. #define PPM_ASSIGN(p,red,grn,blu) do { (p).r = (red); (p).g = (grn); (p).b = (blu); } while ( 0 )
  58. #define PPM_EQUAL(p,q) ( (p).r == (q).r && (p).g == (q).g && (p).b == (q).b )
  59. #define PPM_FORMAT_TYPE(f) ((f) == PPM_FORMAT || (f) == RPPM_FORMAT ? PPM_TYPE : PGM_FORMAT_TYPE(f))
  60.  
  61. typedef pixel xel;
  62. typedef pixval xelval;
  63. #define PNM_MAXMAXVAL PPM_MAXMAXVAL
  64. #define PNM_GET1(x) PPM_GETB(x)
  65. #define PNM_ASSIGN1(x,v) PPM_ASSIGN(x,0,0,v)
  66. #define PNM_EQUAL(x,y) PPM_EQUAL(x,y)
  67. #define PNM_FORMAT_TYPE(f) PPM_FORMAT_TYPE(f)
  68.  
  69.  
  70. /* Magic constants. */
  71.  
  72. #define PBM_MAGIC1 'P'
  73. #define PBM_MAGIC2 '1'
  74. #define RPBM_MAGIC2 '4'
  75. #define PBM_FORMAT (PBM_MAGIC1 * 256 + PBM_MAGIC2)
  76. #define RPBM_FORMAT (PBM_MAGIC1 * 256 + RPBM_MAGIC2)
  77. #define PBM_TYPE PBM_FORMAT
  78.  
  79. #define PGM_MAGIC1 'P'
  80. #define PGM_MAGIC2 '2'
  81. #define RPGM_MAGIC2 '5'
  82. #define PGM_FORMAT (PGM_MAGIC1 * 256 + PGM_MAGIC2)
  83. #define RPGM_FORMAT (PGM_MAGIC1 * 256 + RPGM_MAGIC2)
  84. #define PGM_TYPE PGM_FORMAT
  85.  
  86. #define PPM_MAGIC1 'P'
  87. #define PPM_MAGIC2 '3'
  88. #define RPPM_MAGIC2 '6'
  89. #define PPM_FORMAT (PPM_MAGIC1 * 256 + PPM_MAGIC2)
  90. #define RPPM_FORMAT (PPM_MAGIC1 * 256 + RPPM_MAGIC2)
  91. #define PPM_TYPE PPM_FORMAT
  92.  
  93.  
  94. /* Color scaling macro -- to make writing ppmtowhatever easier. */
  95.  
  96. #define PPM_DEPTH(newp,p,oldmaxval,newmaxval) \
  97.     PPM_ASSIGN( (newp), \
  98.     ( (int) PPM_GETR(p) * (newmaxval) + (oldmaxval) / 2 ) / (oldmaxval), \
  99.     ( (int) PPM_GETG(p) * (newmaxval) + (oldmaxval) / 2 ) / (oldmaxval), \
  100.     ( (int) PPM_GETB(p) * (newmaxval) + (oldmaxval) / 2 ) / (oldmaxval) )
  101.  
  102.  
  103. /* Luminance macro. */
  104.  
  105. #define PPM_LUMIN(p) ( 0.299 * PPM_GETR(p) + 0.587 * PPM_GETG(p) + 0.114 * PPM_GETB(p) )
  106.  
  107.  
  108. /* Declarations of pnmrw routines. */
  109.  
  110. void pnm_init2 ARGS(( char* pn ));
  111.  
  112. char** pm_allocarray ARGS(( int cols, int rows, int size ));
  113. #define pnm_allocarray( cols, rows ) ((xel**) pm_allocarray( cols, rows, sizeof(xel) ))
  114. char* pm_allocrow ARGS(( int cols, int size ));
  115. #define pnm_allocrow( cols ) ((xel*) pm_allocrow( cols, sizeof(xel) ))
  116. void pm_freearray ARGS(( char** its, int rows ));
  117. #define pnm_freearray( xels, rows ) pm_freearray( (char**) xels, rows )
  118. void pm_freerow ARGS(( char* itrow ));
  119. #define pnm_freerow( xelrow ) pm_freerow( (char*) xelrow )
  120.  
  121. xel** pnm_readpnm ARGS(( FILE* file, int* colsP, int* rowsP, xelval* maxvalP, int* formatP ));
  122. int pnm_readpnminit ARGS(( FILE* file, int* colsP, int* rowsP, xelval* maxvalP, int* formatP ));
  123. int pnm_readpnmrow ARGS(( FILE* file, xel* xelrow, int cols, xelval maxval, int format ));
  124.  
  125. int pnm_writepnm ARGS(( FILE* file, xel** xels, int cols, int rows, xelval maxval, int format, int forceplain ));
  126. int pnm_writepnminit ARGS(( FILE* file, int cols, int rows, xelval maxval, int format, int forceplain ));
  127. int pnm_writepnmrow ARGS(( FILE* file, xel* xelrow, int cols, xelval maxval, int format, int forceplain ));
  128.  
  129. extern xelval pnm_pbmmaxval;
  130. /* This is the maxval used when a PNM program reads a PBM file.  Normally
  131. ** it is 1; however, for some programs, a larger value gives better results
  132. */
  133.  
  134.  
  135. /* File open/close that handles "-" as stdin and checks errors. */
  136.  
  137. FILE* pm_openr ARGS(( char* name ));
  138. FILE* pm_openw ARGS(( char* name ));
  139. int pm_closer ARGS(( FILE* f ));
  140. int pm_closew ARGS(( FILE* f ));
  141.  
  142.  
  143. /* Colormap stuff. */
  144.  
  145. typedef struct colorhist_item* colorhist_vector;
  146. struct colorhist_item
  147.     {
  148.     pixel color;
  149.     int value;
  150.     };
  151.  
  152. typedef struct colorhist_list_item* colorhist_list;
  153. struct colorhist_list_item
  154.     {
  155.     struct colorhist_item ch;
  156.     colorhist_list next;
  157.     };
  158.  
  159. typedef colorhist_list* colorhash_table;
  160.  
  161. colorhist_vector ppm_computecolorhist ARGS(( pixel** pixels, int cols, int rows, int maxcolors, int* colorsP ));
  162. /* Returns a colorhist *colorsP long (with space allocated for maxcolors. */
  163.  
  164. void ppm_addtocolorhist ARGS(( colorhist_vector chv, int* colorsP, int maxcolors, pixel* colorP, int value, int position ));
  165.  
  166. void ppm_freecolorhist ARGS(( colorhist_vector chv ));
  167.  
  168. colorhash_table ppm_computecolorhash ARGS(( pixel** pixels, int cols, int rows, int maxcolors, int* colorsP ));
  169.  
  170. int
  171. ppm_lookupcolor ARGS(( colorhash_table cht, pixel* colorP ));
  172.  
  173. colorhist_vector ppm_colorhashtocolorhist ARGS(( colorhash_table cht, int maxcolors ));
  174. colorhash_table ppm_colorhisttocolorhash ARGS(( colorhist_vector chv, int colors ));
  175.  
  176. int ppm_addtocolorhash ARGS(( colorhash_table cht, pixel* colorP, int value ));
  177. /* Returns -1 on failure. */
  178.  
  179. colorhash_table ppm_alloccolorhash ARGS(( void ));
  180.  
  181. void ppm_freecolorhash ARGS(( colorhash_table cht ));
  182.  
  183. #endif /*_PNMRW_H_*/
  184.